package com.example.petinfo.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.petinfo.domain.dto.PetInfoRespDTO;
import com.example.petinfo.domain.dto.PetRegisterDTO;
import com.example.petinfo.domain.dto.PetUpdateDTO;
import com.example.petinfo.domain.po.PetInfo;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Map;

/**
 * 宠物信息业务接口（定义核心业务能力）
 */
public interface PetInfoService {

    /**
     * 注册宠物（主人创建宠物档案）
     * @param registerDTO 注册请求参数
     * @param ownerUserId 主人用户ID（从UserContext获取）
     * @return 注册成功的宠物ID
     */
    Long registerPet(PetRegisterDTO registerDTO, Long ownerUserId);

    /**
     * 更新宠物信息（主人修改档案）
     * @param updateDTO 更新请求参数
     * @param operatorUserId 操作人ID（必须是宠物主人，否则无权限）
     * @return 是否更新成功
     */
    Boolean updatePetInfo(PetUpdateDTO updateDTO, Long operatorUserId);

    /**
     * 分页查询主人的宠物列表（"我的宠物"）
     * @param ownerUserId 主人用户ID
     * @param pageNum 页码
     * @param pageSize 每页条数
     * @return 分页宠物详情列表
     */
    IPage<PetInfoRespDTO> getOwnerPetPage(Long ownerUserId, Integer pageNum, Integer pageSize);

    /**
     * 根据宠物ID查询详情（供代养人查看、业务服务调用）
     * @param petId 宠物ID
     * @return 宠物详情DTO
     */
    PetInfoRespDTO getPetInfoById(Long petId);

    /**
     * 分页查询指定状态的宠物（供代养搜索：外借=1或6，支持分类/品种筛选）
     * @param pageNum 页码
     * @param pageSize 每页条数
     * @param petCategory 宠物分类（可选）
     * @param petBreed 宠物品种（可选）
     * @return 分页宠物详情列表
     */
    IPage<PetInfoRespDTO> getPetByLendStatusPage(Integer pageNum, Integer pageSize, String petCategory, String petBreed);

    /**
     * 更新宠物外借状态（供business-manage-service远程调用）
     * @param petId 宠物ID
     * @param newLendStatus 新外借状态
     * @param responsibleUserId 负责人ID（可选，状态变更时可能需要更新）
     * @return 是否更新成功
     */
    Boolean updateLendStatus(Long petId, Integer newLendStatus, Long responsibleUserId);

    /**
     * 更新待选择代养人集合（供business-manage-service远程调用）
     * @param petId 宠物ID
     * @param fosterIds 代养人ID集合（逗号分隔）
     * @return 是否更新成功
     */
    Boolean updateToBeSelectedFosterIds(Long petId, String fosterIds);

    /**
     * 根据宠物ID查询原始实体（供内部服务调用）
     * @param petId 宠物ID
     * @return 宠物实体
     */
    PetInfo getOriginalPetById(Long petId);

    public Map<String, Integer> countBreedByLendStatus(Integer status1,Integer status2);
}
